/**
 * 数据处理工具类
 */

/**
 * 判断一个值是否为整数
 * @param {*} value - 要判断的值
 * @returns {boolean} 是否为整数
 */
function isInteger(value) {
  return Number.isInteger(value);
}

/**
 * 将对象中的整数值转换为字符串
 * @param {Object} obj - 要处理的对象
 * @returns {Object} 处理后的对象
 */
function convertIntegersToStrings(obj) {
  if (obj === null || obj === undefined) {
    return obj;
  }
  
  // 如果是数组，递归处理每个元素
  if (Array.isArray(obj)) {
    return obj.map(item => convertIntegersToStrings(item));
  }
  
  // 如果不是对象，直接返回
  if (typeof obj !== 'object') {
    return isInteger(obj) ? String(obj) : obj;
  }
  
  // 处理对象的每个属性
  const result = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      const value = obj[key];
      
      // 如果值是对象或数组，递归处理
      if (typeof value == 'object' && value !== null) {
        result[key] = convertIntegersToStrings(value);
      } 
      // 如果值是整数，转换为字符串
      else if (isInteger(value)) {
        result[key] = String(value);
      } 
      // 其他情况保持原值
      else {
        result[key] = value;
      }
    }
  }
  
  return result;
}

/**
 * 处理对象或对象数组，将整数值转换为字符串
 * @param {Object|Array} data - 要处理的数据（对象或对象数组）
 * @returns {Object|Array} 处理后的数据
 */
export function convertObjectIntegersToStrings(data) {
  return convertIntegersToStrings(data);
}

/**
 * 深拷贝并转换整数为字符串
 * @param {Object|Array} data - 要处理的数据
 * @returns {Object|Array} 处理后的新数据
 */
export function deepCopyAndConvertIntegers(data) {
  // 先深拷贝，再转换
  const copied = JSON.parse(JSON.stringify(data));
  return convertIntegersToStrings(copied);
}

/**
 * 仅转换指定字段的整数值为字符串
 * @param {Object|Array} data - 要处理的数据
 * @param {Array} fields - 要转换的字段名数组
 * @returns {Object|Array} 处理后的数据
 */
export function convertSpecificFieldsToStrings(data, fields = []) {
  if (!data || fields.length == 0) {
    return data;
  }
  
  // 如果是数组，处理每个元素
  if (Array.isArray(data)) {
    return data.map(item => convertSpecificFieldsToStrings(item, fields));
  }
  
  // 如果不是对象，直接返回
  if (typeof data !== 'object') {
    return data;
  }
  
  const result = { ...data };
  
  fields.forEach(field => {
    if (result.hasOwnProperty(field) && isInteger(result[field])) {
      result[field] = String(result[field]);
    }
  });
  
  return result;
}